run:
  timeout: 15m
  skip-files:
    # Skip autogenerated files.
    - ^.*\.(pb|y)\.go$
  skip-dirs:
    # Copied it from a different source
    - storage/remote/otlptranslator/prometheusremotewrite
    - storage/remote/otlptranslator/prometheus

output:
  sort-results: true

linters:
  enable:
    - depguard
    - errorlint
    - gocritic
    - godot
    - gofumpt
    - goimports
    - misspell
    - nolintlint
    - perfsprint
    - predeclared
    - revive
    - testifylint
    - unconvert
    - unused
    - usestdlibvars
    - whitespace

issues:
  max-same-issues: 0
  exclude-rules:
    - linters:
        - gocritic
      text: "appendAssign"
    - path: _test.go
      linters:
        - errcheck
    - path: "tsdb/head_wal.go"
      linters:
        - errorlint
    - linters:
        - godot
      source: "^// ==="
    - linters:
        - perfsprint
      text: "fmt.Sprintf can be replaced with string addition"
linters-settings:
  depguard:
    rules:
      main:
        deny:
          - pkg: "sync/atomic"
            desc: "Use go.uber.org/atomic instead of sync/atomic"
          - pkg: "github.com/stretchr/testify/assert"
            desc: "Use github.com/stretchr/testify/require instead of github.com/stretchr/testify/assert"
          - pkg: "github.com/go-kit/kit/log"
            desc: "Use github.com/go-kit/log instead of github.com/go-kit/kit/log"
          - pkg: "io/ioutil"
            desc: "Use corresponding 'os' or 'io' functions instead."
          - pkg: "regexp"
            desc: "Use github.com/grafana/regexp instead of regexp"
          - pkg: "github.com/pkg/errors"
            desc: "Use 'errors' or 'fmt' instead of github.com/pkg/errors"
          - pkg: "gzip"
            desc: "Use github.com/klauspost/compress instead of gzip"
          - pkg: "zlib"
            desc: "Use github.com/klauspost/compress instead of zlib"
          - pkg: "golang.org/x/exp/slices"
            desc: "Use 'slices' instead."
  errcheck:
    exclude-functions:
      # Don't flag lines such as "io.Copy(io.Discard, resp.Body)".
      - io.Copy
      # The next two are used in HTTP handlers, any error is handled by the server itself.
      - io.WriteString
      - (net/http.ResponseWriter).Write
      # No need to check for errors on server's shutdown.
      - (*net/http.Server).Shutdown
      # Never check for logger errors.
      - (github.com/go-kit/log.Logger).Log
      # Never check for rollback errors as Rollback() is called when a previous error was detected.
      - (github.com/prometheus/prometheus/storage.Appender).Rollback
  goimports:
    local-prefixes: github.com/prometheus/prometheus
  gofumpt:
    extra-rules: true
  perfsprint:
     # Optimizes `fmt.Errorf`.
    errorf: false
  revive:
    # By default, revive will enable only the linting rules that are named in the configuration file.
    # So, it's needed to explicitly set in configuration all required rules.
    # The following configuration enables all the rules from the defaults.toml
    # https://github.com/mgechev/revive/blob/master/defaults.toml
    rules:
      # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md
      - name: blank-imports
      - name: context-as-argument
        arguments:
          # allow functions with test or bench signatures
          - allowTypesBefore: "*testing.T,testing.TB"
      - name: context-keys-type
      - name: dot-imports
      # A lot of false positives: incorrectly identifies channel draining as "empty code block".
      # See https://github.com/mgechev/revive/issues/386
      - name: empty-block
        disabled: true
      - name: error-naming
      - name: error-return
      - name: error-strings
      - name: errorf
      - name: exported
      - name: increment-decrement
      - name: indent-error-flow
      - name: package-comments
      - name: range
      - name: receiver-naming
      - name: redefines-builtin-id
      - name: superfluous-else
      - name: time-naming
      - name: unexported-return
      - name: unreachable-code
      - name: unused-parameter
        disabled: true
      - name: var-declaration
      - name: var-naming
  testifylint:
    disable:
      - float-compare
      - go-require
    enable:
      - bool-compare
      - compares
      - empty
      - error-is-as
      - error-nil
      - expected-actual
      - len
      - require-error
      - suite-dont-use-pkg
      - suite-extra-assert-call
